<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 按钮点击事件，点击按钮弹出警告框：hello word -->
     <input type="button" value="按钮" onclick="(function(){alert('hello word')})()">
</body>
<script>
    //函数表达式：把函数赋值给一个变量
    let s=function say(){
        console.log('hello');
    }

    //函数调用：变量名（）；
    s();  //hello
    //console.log(s());

    let h=function say(){
        console.log('你好');
    }
    h();   //你好

    //匿名函数：没有函数名字
    let num=function(a,b){
        return a<b?a:b;   //三元运算符
    }
    console.log(num(-1,4));

    //立即执行函数：匿名自调函数
    (function(a,b){
        console.log(a+b); 
    })(1,2);

    //回调函数：把函数A作为参数传递给函数B，在函数A就叫做回调函数
    let f1 =function(){
        return 'hello';
    }
    console.log(typeof f1);    //数据类型：function

    let f2=function(){
        return '你好';
    }
    //把函数作为一个参数
    let fn=function(x,y){
        //在fn函数中调用y函数
        console.log(x+':'+y());
    }
    fn('en:',f1);    //en::hello
    fn('ch:',f2);    //ch::你好

    //递归函数：把函数A作为参数传给参数A，在函数A中调用函数A
    //这类函数容易造成死循环
    //阶乘函数：10！=10*9*8*7....*2*1
    //n的阶乘:n*(n-1)!
    let myfn = function(n){
        if(n===1){
            return 1;
        }else{
            //n*(n-1)
            return n*myfn(n-1);
        }
    }
    console.log(myfn(10));
</script>
</html>